/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "终端工作区.h"
#include "ui终端视图.h"

#include "框架/工作区/通用弹出菜单.h"
#include "A_引擎/文件工程/配置.h"

#include "框架/工作区/3D工作区/ui3D场景视口.h"



static std::set<C_工作区页面*> g_终端视图页面;
static C_Widget* g终端视图_删除菜单;



static bool on_终端视图打开(C_Widget* self, bool show) {
	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);
	工作区->m_更新绘制属性 = true;
	//工作区->mui_视口页面->m_更新绘制属性 = true;
	f_页面_渲染层配置(工作区, show);
	return false;
}



void on_终端切换(S_Props& prop) {
	C_工作区页面*	page = static_cast<C_工作区页面*>(prop.m_UI->m_部件->m_父部件->m_父部件);
	C_终端视图*		view = static_cast<C_终端视图*>((page->mui_视口页面));

	f_工作区_重构终端视图状态条(view);
}



void f_工作区_终端视图初始化(S_UI渲染环境& ctx) {
	//g终端视图_删除菜单 = f_通用菜单_节点删除菜单(ctx, on_终端视图_删除渲染世界);
}


C_工作区页面* f_工作区_创建终端视图(S_UI渲染环境& ctx) {
	auto* view = f_终端视图_创建(ctx);


	C_工作区页面* 工作区 = new C_工作区页面(
		E_工作区类型::e_终端视口,
		ctx,
		E_方向::e_横向,
		view,
		view->m_状态条,
		view->m_属性栏);

	工作区->mf_打开关闭 = on_终端视图打开;

	g_终端视图页面.insert(工作区);

	f_工作区_重构终端视图状态条(view);
	f_页面_渲染层配置(工作区, true);

	return 工作区;
}

void f_工作区_销毁终端视图(C_工作区页面* page) {
	g_终端视图页面.erase(page);
	delete page;
}

static void f_打开终端视口说明(S_Props& prop) {
	
}

void f_工作区_重构终端视图状态条(C_Widget* view) {
	std::vector<S_Props> props;

	C_终端视图* box = static_cast<C_终端视图*>(view);

	//auto prop = f_alloc_OpsProp(f_打开大纲视口说明, u"场景视口说明", u"疑问");
	//prop.m_风格属性->m_图元形状 = &view->m_UIctx->m_Ctx.m_几何图形->m_平面圆形;
	//prop.m_布局方式 = E_布局方式::e_等比;
	//props.push_back(prop);

	props.push_back(f_alloc_NoneProp());
	
	//auto 分区 = f_alloc_EnumProp(&box->m_当前视图内容, {
	//	{u"场景",		u"加载物体"},
	//	{u"动态创建",	u"物体"},
	//	{u"渲染层",		u"layers_1"},
	//	{u"节点",		u"节点"},
	//}, u"分区");
	//分区.m_UI->m_Update = on_大纲切换;
	//props.push_back(分区);

	//switch (box->m_当前视图内容) {
	//	case 0: {
	//		break;
	//	}
	//	case 2: {
	//		props.push_back(f_alloc_NoneProp());
	//		auto 添加渲染层 = f_alloc_OpsProp(on_添加渲染世界, u"添加渲染世界");
	//		props.push_back(添加渲染层);
	//		auto 删除渲染层 = f_alloc_OpsProp(on_删除渲染世界, u"删除渲染世界");
	//		props.push_back(删除渲染层);
	//		break;
	//	}
	//	default:
	//		break;
	//}
	
	props.push_back(f_alloc_NoneProp());
	
	box->m_状态条->f_构建属性部件(props, nullptr);
}




void f_终端视图页面_联动更新(E_工作区类型 来源工作区类型, E_工作区操作类型 操作类型) {
	switch (操作类型) {
		case e_创建节点:
		case e_删除节点:
			break;
		case e_拾取物体: {
			std::vector<S_Object*> item(S_框架::g_拾取物体.begin(), S_框架::g_拾取物体.end());

			for (auto& e : C_终端视图::g终端视图) {
				auto* w = e->f_get子组件(0);
				f_ui_树形框_设置选择项(w, item.data(), item.size());
				f_widget_更新绘制(w);
			}
		}
		case e_创建物体:
		case e_删除物体: {
			f_终端视图页面_更新绘制();
			break;
		}

		default:
			break;
	}
}

void f_终端视图工作区_销毁() {
	for (auto& e : g_终端视图页面) {
		f_工作区_销毁终端视图(e);
	}
	g_终端视图页面.clear();
}

void f_终端视图页面_更新绘制() {
	for (auto& e : C_终端视图::g终端视图) {
		if (e->m_显示) {
			f_widget_更新绘制(e);
		}
	}
}

void f_终端视图工作区_保存工作区状态(FILE* f, C_工作区页面* 页面) {
	auto 文件块 = f_文件块_创建(E_节点工程文件块类型::e_工程文件块_大纲视口工作区状态, S_引擎配置::g_文件版本号);
	S_UI8Array* 块 = (S_UI8Array*)f_core_array_new(0, sizeof(uint8));

	C_终端视图* view = dynamic_cast<C_终端视图*>(页面->mui_视口页面);
	//f_prop_Save(view->m_当前视图内容, 块);

	f_file_保存文件块(f, 文件块, 块);
}

void f_终端视图工作区_加载工作区状态(FILE* f, C_工作区页面* 页面) {
	S_文件块 文件块 = f_file_读取文件块(f);

	C_终端视图* view = dynamic_cast<C_终端视图*>(页面->mui_视口页面);

	if (文件块.m_块类型 == E_节点工程文件块类型::e_工程文件块_大纲视口工作区状态) {
		const uint8* 下一次读取数据指针 = 文件块.m_data;
		if (f_file_版本对比(文件块, S_引擎配置::g_低版本号_0, S_引擎配置::g_文件版本号)) {
			//下一次读取数据指针 = f_文件块_读数据块(下一次读取数据指针, view->m_当前视图内容);
		}
		//下一次读取数据指针 = f_prop_Load(m_计算类型, 下一次读取数据指针);
	}
	free(文件块.m_data);
}



